package models

import (
	"fmt"
	"time"

	"github.com/EDDYCJY/go-gin-example/pkg/e"
	"github.com/EDDYCJY/go-gin-example/pkg/logging"
	"github.com/jinzhu/gorm"
)

type File struct {
	ID   uint   `gorm:"primaryKey;comment:'文件ID'"`
	Name string `gorm:"not null;default:'';comment:'文件名'"`

	FilePath      string `gorm:"column:file_path;default:'';comment:'文件路径'"`
	FileSizeBytes uint   `gorm:"column:filesize_bytes;default:0;comment:'文件大小（字节）'"`
	DataCategory  uint   `gorm:"column:type;default:1011;comment:'文件类型 1011数据集，1021模型数据集'"`
	MainCategory  string `gorm:"column:main_category;default:'other';comment:'主要类别'"`
	SubCategory   string `gorm:"column:sub_category;default:'other';comment:'子类别'"`
	Description   string `gorm:"column:description;default:'';comment:'描述'"`
	ImageURL      string `gorm:"column:image_url;type:TEXT;comment:'图片的base64值或者URL地址'"`

	UserID    uint `gorm:"column:user_id;default:0;comment:'用户ID，指示文件所属用户'"`
	Favourite int  `gorm:"column:favourite;default:0;comment:'用户的收藏数'"`
	Freeze    int  `gorm:"column:freeze;default:0;comment:'文件是否被冻结'"`

	CreatedOn  time.Time `gorm:"column:created_on;default:CURRENT_TIMESTAMP;comment:'创建时间'"`
	ModifiedOn time.Time `gorm:"column:modified_on;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:'更新时间'"`
	DeletedOn  time.Time `gorm:"column:deleted_on;default:null;comment:'删除时间'"`
}

type SearchTerm struct {
	Description string
}

// 验证文件是否存在
// todo 修改error返回的方式
func GetFileByFileName(fileName string) (*File, *e.FResult) {
	var file File
	result := db.Debug().Model(&file).Where("name = ?", fileName).First(&file)

	err := result.Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return nil, &e.FResult{ErrCode: e.ERROR, ErrMsg: "充值记录不存在"}
		} else {
			return nil, &e.FResult_ERROR
		}
	}

	return &file, &e.FResult_OK
}

func CreateFile(file *File) error {
	err := db.Debug().Create(file).Error
	if err != nil {
		logging.Warn("failed to create file: ", err.Error())
		return err
	}
	return nil
}

// GetFileList 返回指定页码和每页大小的文件列表。
// 参数 file 是一个指向 File 结构体的指针，用于指定查询的表和字段。
// 参数 searchTerm 是一个指向 SearchTerm 结构体的指针，用于指定查询的条件。
// 参数 pageNum 是要查询的页码。
// 参数 pageSize 是每页的大小。
// 返回值是一个指向 File 结构体的指针切片，包含了查询结果。
func GetFileList(file *File, searchTerm *SearchTerm, pageNum, pageSize int) (files []*File, err error) {

	//根据页码和每页大小计算offset
	offset := (pageNum - 1) * pageSize
	//从数据库查询File数据,根据ID倒序排序
	err = db.Debug().Model(&file).Where(&file).Where("description like ?", "%"+searchTerm.Description+"%").Order("id desc").Offset(offset).Limit(pageSize).Find(&files, &file).Error
	if err != nil && err != gorm.ErrRecordNotFound {
		logging.Warn("failed to get file list: ", err.Error())
		return nil, err
	}

	return files, nil

}

// GetFileListCount 返回指定条件的文件数量。
// 参数 file 是一个指向 File 结构体的指针，用于指定查询的表和字段。
// 参数 searchTerm 是一个指向 SearchTerm 结构体的指针，用于指定查询的条件。
// 返回值是一个 int，表示查询结果的数量。
func GetFileListCount(file *File, searchTerm *SearchTerm) (count int, err error) {
	fmt.Printf("%+v", file)
	err = db.Debug().Model(&file).Where(&file).Where("description like ?", "%"+searchTerm.Description+"%").Count(&count).Error
	return count, err
}
